package com.daily.daily_push.repository;

import com.daily.daily_push.po.UserInfo;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Repository
public interface UserInfoRepository extends JpaRepository<UserInfo, Long> , JpaSpecificationExecutor<UserInfo> {



    List<UserInfo>  findByNameAndAgeAndSex(String name,Long age,String sex);

    // 根据姓名删除用户，并返回删除的数量
    // 注意：修改数据库状态的操作（删除、修改）必须在事务中进行，所以需要 @Transactional 注解
    @Transactional
    long deleteByName(String name);

    // 根据年龄大于某个值的条件删除，并返回被删除的用户列表
    @Transactional
    List<UserInfo> removeByAgeGreaterThan(Long age);



    @Modifying // 声明这是一个修改操作
    @Transactional // 建议将事务注解放在 Service 层，但这里为了演示也可以放在 Repository
    @Query("DELETE FROM UserInfo u WHERE u.age < :age")
    int deleteUsersByAgeLessThan(@Param("age") Long age);





    /**
     * 根据 ID 更新用户的姓名
     * @param id 用户ID
     * @param newName 新的姓名
     * @return 返回受影响的行数
     */
    // 执行后清空持久化上下文，在 @Modifying 注解中设置 clearAutomatically = true。这会在执行完修改查询后，
    // 自动清空底层的持久化上下文，确保后续查询能获取到最新的数据。
    @Modifying(clearAutomatically = true)
    @Transactional
    @Query("UPDATE UserInfo u SET u.name = :newName WHERE u.id = :id")
    int updateNameById(@Param("id") Long id, @Param("newName") String newName);
    /**
     * 根据年龄更新所有符合条件的用户的性别
     * @param age 年龄
     * @param newSex 新的性别
     * @return 返回受影响的行数
     */
    @Modifying
    @Transactional
    @Query("UPDATE UserInfo u SET u.sex = :newSex WHERE u.age > :age")
    int updateSexForUsersOlderThan(@Param("age") Long age, @Param("newSex") String newSex);



//   JPQL vs 原生 SQL：@Query 默认使用 JPQL。如果你想使用特定数据库的原生 SQL，可以设置 nativeQuery = true。
    @Modifying
    @Transactional
    @Query(value = "UPDATE user_info SET name = ?2 WHERE id = ?1", nativeQuery = true)
    int updateNameByIdNative(Long id, String newName);

}
